const path = require('path')
const { cwd } = require('process')
console.info('__filename', __filename) // C:\Leslie\NodeJs\1-NodeJs-Core-Module\codes\10-path.js
console.info('__dirname', __dirname) // C:\Leslie\NodeJs\1-NodeJs-Core-Module\codes

// ########### 🚀🚀 4. path.parse() 解析路径 ###########
/**
 * 1. 接收一个路径,返回一个对象, 包含不同的信息
 * 2. root dir base ext name
 */
// 解析文件路径
const obj1 = path.parse('/a/b/c/index.html')
console.info('obj1', obj1)
/**
    obj {
        root: '/',
        dir: '/a/b/c',
        base: 'index.html',
        ext: '.html',
        name: 'index'
    }
 */
// 解析目录路径
const obj2 = path.parse('/a/b/c')
console.info('obj2', obj2) // obj2 { root: '/', dir: '/a/b', base: 'c', ext: '', name: 'c' }
const obj3 = path.parse('/a/b/c/')
console.info('obj3', obj3) // obj3 { root: '/', dir: '/a/b', base: 'c', ext: '', name: 'c' }
// 相对路径
const obj4 = path.parse('./a/b/c/')
console.info('obj4', obj4) // obj4 { root: '', dir: './a/b', base: 'c', ext: '', name: 'c' }

// ########### 🚀🚀 5. path.format() 序列号路径 ###########
const obj5 = path.parse('./a/b/c')
console.info(path.format(obj5)) // ./a/b\c

// ########### 🚀🚀 6. path.isAbsolute() 判断当前路径是否为绝对路径 ###########
console.info(path.isAbsolute('foo')) // false
console.info(path.isAbsolute('/foo')) // true
console.info(path.isAbsolute('///foo')) // true
console.info(path.isAbsolute('')) // false
console.info(path.isAbsolute('.')) // false
console.info(path.isAbsolute('./foo')) // false
console.info(path.isAbsolute('../foo')) // false
console.info(path.isAbsolute(__dirname)) // true

// ########### 🚀🚀 7. path.join() 拼接(相对)路径 ###########
console.info(path.join('a/b', 'c', 'index.html')) // a\b\c\index.html
console.info(path.join('/a/b', 'c', 'index.html')) // \a\b\c\index.html
// ../ => 上层的目录
console.info(path.join('/a/b', 'c', '../', 'index.html')) // \a\b\index.html
// ./ => 当前的目录
console.info(path.join('/a/b', 'c', './', 'index.html')) // \a\b\c\index.html
// 忽略 空字符串
console.info(path.join('/a/b', 'c', '', 'index.html')) // \a\b\c\index.html
// 只有一个参数且为空的时候 . => 当前工作目录
console.info(path.join('')) // .

// ########### 🚀🚀 8. path.normalize() 规范化路径 ###########
console.info(path.normalize('a/b/c/d')) // a\b\c\d
console.info(path.normalize('a///b/c/../d')) // a\b\d
console.info(path.normalize('a///b/c../d')) // a\b\c..\d
console.info(path.normalize('a//\b/c\\/d')) // a\c\d
console.info(path.normalize('')) // . => 当前工作目录

// ########### 🚀🚀 9. path.resolve() 返回绝对路径 ###########

// console.info(process.cwd()) // C:\Leslie\NodeJs\1-NodeJs-Core-Module\codes

// 如果什么都不传,相当于传进去的是 cwd
// 将来我们再往里面传东西的时候, 它前面的绝对路径都应该是前面这个 cwd
// console.info(path.resolve()) // C:\Leslie\NodeJs\1-NodeJs-Core-Module\codes

/**
 * 接收两部分参数 resolve([from],to)
 * resolve的功能是把 to 部分拼接成一个绝对路径,
 * 如果它拼接完成后发现to不是一个绝对的,会把我们的盘符对应的路径加上,让它变成一个绝对的
 *
 * from 是什么时候工作的呢? 取决于传参的方式
 *  如果是 path.resolve('a', 'b') 这种方式: a,b 都属于 to的部分, a/b显然不是一个绝对路径,然后加上前面的cwd()
 *  如果在 b 的前面加了一些分割符 /b, 这个时候 a就变成了from的部分, 这个时候就会考虑 a, /b 的关系, 这个时候a, /b没有关系
 * 如果是 resolve('/a','b') '/a'绝对路径的写法, /a/b 加上盘符
 *
 */
console.info(path.resolve('a', 'b')) // C:\Leslie\NodeJs\1-NodeJs-Core-Module\codes/a/b
console.info(path.resolve('a', '/b')) // C:\b
console.info(path.resolve('/a', '/b')) // C:\b
console.info(path.resolve('/a', 'b')) // C:\a\b

// 取决于第二个参数是怎么传的
console.info(path.resolve('/a', '/b')) // C:\b

// 正常使用
console.info(path.resolve('index.html')) // C:\Leslie\NodeJs\1-NodeJs-Core-Module\codes\index.html
